Technical Q&A QA1146
Illustrating document window changes in Swing


Q: é©ï™Çà Java ÉAÉvÉäÉPÅ[ÉVÉáÉìDžǮǢǃÉhÉLÉÖÉÅÉìÉgÉEÉBÉìÉhÉEÇ™ïœçXÇ≥ÇÍÇΩDZÇΔÇé¶ÇµÇΩÇ¢ÇΔévǡǃǢNjÇ∑ÅBÇ«ÇÃÇÊǧDžÇ∑ÇÍÇŒÅACarbon ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ‚ Cocoa ÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔìØÇ∂ÇÊǧDžÅAÉEÉBÉìÉhÉEÇÃÅmï¬Ç∂ÇÈÅnÉ{É^ÉìÇ…ï\é¶Ç≥ÇÍÇÈÉhÉbÉgÇï`âÊÇ≈Ç´Ç‹Ç∑Ç©ÅH


Modified Document   Unchanged Document
ê} 1Å@êVǵǢNjÇΩÇÕñ¢ï€ë∂ÇÃïœçXÇä‹ÇfiÉEÉBÉìÉhÉEÇÃÅmï¬Ç∂ÇÈÅnÉ{É^ÉìÇΔä‹Ç‹Ç»Ç¢ÉEÉBÉìÉhÉEÇÃÅmï¬Ç∂ÇÈÅnÉ{É^Éì

A: Mac OS X Ç≈ÅAJava 1.3.1 Çà Swing Çóòópǵ Aqua ÇÃÉãÉbÉNÉAÉìÉhÉtÉBÅ[ÉãÇégǡǃǢÇÈèÍçáÇÕÅA ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ÉCÉìÉWÉPÅ[É^ÇÅmï¬Ç∂ÇÈÅnÉ{É^ÉìÇ…ï`âÊÇ∑ÇÈÉsÉÖÉA Java Ç…ÇÊÇÈï˚ñ@ǙdžÇËÇ‹Ç∑ÅBDZÇÃï˚ñ@ÇΔÇÕÅAJComponent ÇÃÇ∑Ç◊ǃÇÃÉTÉuÉNÉâÉXÇ≈óòópÇ≈Ç´ÇÈ putClientProperty() ÉÅÉ\ÉbÉhÇégǡǃê›íËÇ≈Ç´ÇÈíPèÉÇ» Swing ÉNÉâÉCÉAÉìÉgÉvÉçÉpÉeÉBÇ≈Ç∑ÅBDZÇÃÉvÉçÉpÉeÉBÇÕ windowModified Ç≈džÇËÅA ÉvÉçÉpÉeÉBílÇï\Ç∑ Booloean ÉIÉuÉWÉFÉNÉgÇégǡǃê›íËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇÕÅAJInternalFrameÅAÇ‹ÇΩÇÕ JFrameÅiJFrame ÇÕÅAAWT Frame ÉNÉâÉXÇÃägí£ÉNÉâÉXÇ≈ÅAclientProperty ÇÃÉTÉ|Å[ÉgÇÕdžÇËÇ‹ÇπÇÒÅjÇà rootPane Ç…ëŒÇµÇƒíºê⁄ê›íËÇ≈Ç´Ç‹Ç∑ÅBÉäÉXÉg 1 ÇÕÅAÉeÉLÉXÉgÉGÉfÉBÉ^Ç…Ç®ÇØÇÈDZÇÃÉvÉçÉpÉeÉBÇÃégópï˚ñ@Çé¶ÇµÇ‹Ç∑ÅB



import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class Editor extends JFrame
  implements DocumentListener, ActionListener {

    final static String WINDOW_MODIFIED = "windowModified";

    JEditorPane jp;
    JMenuBar jmb;
    JMenu file;
    JMenuItem save;

    public Editor(String title) {
        super(title);
        jp = new JEditorPane();
        jp.getDocument().addDocumentListener(this);
        getContentPane().add(jp);
        jmb = new JMenuBar();
        file = new JMenu("File");
        save = new JMenuItem("Save");
        save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
          java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        save.addActionListener(this);
        file.add(save);
        jmb.add(file);
        setJMenuBar(jmb);
        setSize(400,600);
        setVisible(true);
    }

    // doChange() ÇΔ actionPerformed() Ç≈ÅAwindowModified ÇÃèÛë‘ÇàµÇ§
    public void doChange() {
        getRootPane().putClientProperty(WINDOW_MODIFIED, Boolean.TRUE);
    }

    public void actionPerformed(ActionEvent e) {
        // DZDZÇ≈ï€ë∂ã@î\ÇãLèqÇ∑ÇÈ
        getRootPane().putClientProperty(WINDOW_MODIFIED, Boolean.FALSE);
    }

    // DocumentListener ÇÃé¿ëï
    public void changedUpdate(DocumentEvent e) { doChange(); }
    public void insertUpdate(DocumentEvent e)  { doChange(); }
    public void removeUpdate(DocumentEvent e)  { doChange(); }

    public static void main(String[] args) {
        new Editor("test");
    }
}

ÉäÉXÉg 1 windowModified ÇÃèÛë‘Çä‹ÇflÇΩÉeÉLÉXÉgÉGÉfÉBÉ^




[2002 îN 6 åé 18 ì˙]